package com.dongbao.dialog;

import com.dongbao.core.config.MyState;
import com.dongbao.data.Datacenter;
import com.dongbao.service.MyMqttClient;
import com.dongbao.util.InitUtil;
import com.dongbao.util.StorageConfig;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.openapi.ui.ValidationInfo;
import lombok.Getter;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Vector;

public class SettingsForm extends SimpleToolWindowPanel {

    @Getter
    private JPanel rootPanel;

    @Getter
    private JTextField testValue;
    private JTextField crmUrlPathInput;
    private JLabel crmUrlPathLable;
    private JTextField gitUrlPathInput;
    private JLabel gitUrlPathLable;
    private JTextField mqUrlPathInput;
    private JLabel mqUrlPathLable;
    private JLabel ipScopeLabel;
    private JTextField ipScopeInput;
    private JTextField cachePathInput;
    private JTable daoFileCheckTable;
    private JButton addDaoTableNameBtn;
    private JScrollPane daoSettingScorll;
    private JButton removeDaoTableNameBtn;

    private Integer curCheckRow = null;

    /**
     * 开启/变比提交检测按钮组
     * */
    private ButtonGroup group = new ButtonGroup();

    /**
     * 是否有修改的内容
     * */
    public Boolean isModified = false;


    public SettingsForm(boolean vertical) {
        super(vertical);
    }

    public SettingsForm(boolean vertical, boolean borderless) {
        super(vertical, borderless);
    }

    public SettingsForm() {
        super(true, true);
        add(rootPanel);
        /* 从存储中将值取出还原 */
        StorageConfig config = MyState.getInstance().getConfig();
        crmUrlPathInput.setText(config.getCrmUrlPath());
        gitUrlPathInput.setText(config.getGitUrlPath());
        mqUrlPathInput.setText(config.getMqUrlPath());
        ipScopeInput.setText(config.getIpScope());
        cachePathInput.setText(config.getCachePath());

        /* CRM地址输入 */
        crmUrlPathInput.getDocument().addDocumentListener(new DocumentListener(){
            public void changedUpdate(DocumentEvent e){
                // 当attribute改变时触发
                // 有待继续探索......
                isModified = true;
            }
            public void removeUpdate(DocumentEvent e){
                // 当textField内容被删减时触发
                // 对应到用户行为上可以是用户按下退格键
                isModified = true;
            }
            public void insertUpdate(DocumentEvent e){
                // 当textField内容增加时触发
                // 对应到用户行为是用户键入内容
                isModified = true;
            }
        });

        /* GIT地址输入 */
        gitUrlPathInput.getDocument().addDocumentListener(new DocumentListener(){
            public void changedUpdate(DocumentEvent e){
                // 当attribute改变时触发
                // 有待继续探索......
                isModified = true;
            }
            public void removeUpdate(DocumentEvent e){
                // 当textField内容被删减时触发
                // 对应到用户行为上可以是用户按下退格键
                isModified = true;
            }
            public void insertUpdate(DocumentEvent e){
                // 当textField内容增加时触发
                // 对应到用户行为是用户键入内容
                isModified = true;
            }
        });

        /* MQ地址输入 */
        mqUrlPathInput.getDocument().addDocumentListener(new DocumentListener(){
            public void changedUpdate(DocumentEvent e){
                // 当attribute改变时触发
                // 有待继续探索......
                isModified = true;
            }
            public void removeUpdate(DocumentEvent e){
                // 当textField内容被删减时触发
                // 对应到用户行为上可以是用户按下退格键
                isModified = true;
            }
            public void insertUpdate(DocumentEvent e){
                // 当textField内容增加时触发
                // 对应到用户行为是用户键入内容
                isModified = true;
            }
        });

        /* IP段地址输入 */
        ipScopeInput.getDocument().addDocumentListener(new DocumentListener(){
            public void changedUpdate(DocumentEvent e){
                // 当attribute改变时触发
                // 有待继续探索......
                isModified = true;
            }
            public void removeUpdate(DocumentEvent e){
                // 当textField内容被删减时触发
                // 对应到用户行为上可以是用户按下退格键
                isModified = true;
            }
            public void insertUpdate(DocumentEvent e){
                // 当textField内容增加时触发
                // 对应到用户行为是用户键入内容
                isModified = true;
            }
        });

        /* IP段地址输入 */
        cachePathInput.getDocument().addDocumentListener(new DocumentListener(){
            public void changedUpdate(DocumentEvent e){
                // 当attribute改变时触发
                // 有待继续探索......
                isModified = true;
            }
            public void removeUpdate(DocumentEvent e){
                // 当textField内容被删减时触发
                // 对应到用户行为上可以是用户按下退格键
                isModified = true;
            }
            public void insertUpdate(DocumentEvent e){
                // 当textField内容增加时触发
                // 对应到用户行为是用户键入内容
                isModified = true;
            }
        });

        //设置Dao检测表列表数据
        String[][] daoFileCheckTableNames = config.getDaoFileCheckTableNames();

        String[] tableHead = {"模块","表名","是否控制"};
        Dimension dimension = new Dimension();
        dimension.setSize(-1,200);
        daoFileCheckTable.setMaximumSize(dimension);
        daoSettingScorll.setMaximumSize(dimension);
        DefaultTableModel tableModel = (DefaultTableModel) daoFileCheckTable.getModel();
        tableModel.addColumn("操作");
        tableModel.addColumn("模块");
        tableModel.addColumn("表名");
        tableModel.addColumn("是否控制");


        // 方法一：直接方式 使用TableColumn的setCellRenderer方法（推荐）
        // 此方法可以设置某一列的渲染（即使用某一个组件--即控件来显示单元格数据）
        daoFileCheckTable.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer(){

            /*(non-Javadoc)
             * 此方法用于向方法调用者返回某一单元格的渲染器（即显示数据的组建--或控件）
             * 可以为JCheckBox JComboBox JTextArea 等
             * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
             */
            @Override
            public Component getTableCellRendererComponent(JTable table,
                                                           Object value, boolean isSelected, boolean hasFocus,
                                                           int row, int column) {
                // 创建用于返回的渲染组件
                JCheckBox ck = new JCheckBox();
                // 使具有焦点的行对应的复选框选中
                ck.setSelected(isSelected);
                //根据 isSelected 标识当前行是否为选中状态
                if(isSelected ){
                    curCheckRow = row;
                }else if(!isSelected){
                    curCheckRow = null;
                }
                // 设置单选
                ck.setSelected(hasFocus);
                // 使复选框在单元格内居中显示
                ck.setHorizontalAlignment((int) 0.5f);

                return ck;
            }
        });

        for(String[] item:daoFileCheckTableNames){
            tableModel.addRow(item);
        }
//        JTableHeader tableHeader = new JTableHeader();
//        daoFileCheckTable.setTableHeader(tableHeader);

        //绑定添加Dao检测按钮点击事件
        addDaoTableNameBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //判断是否存在没有写表名的,如果存在则不允许添加新增
                Vector<Vector> dataVector = ((DefaultTableModel) daoFileCheckTable.getModel()).getDataVector();
                Integer rowCount = ((DefaultTableModel) daoFileCheckTable.getModel()).getDataVector().size();
                for(int i=0;i<rowCount;i++){
                    Vector row = dataVector.get(i);
                    for(int j=1;j<tableModel.getColumnCount();j++){
                        if("".equals(row.get(j))){
                            //存在空值,不允许添加
                            ValidationInfo validationInfo = new ValidationInfo("存在未配置的行,不允许添加");
                            Messages.showMessageDialog(validationInfo.message,"提示", Messages.getInformationIcon());
                            return;
                        }
                    }
                }
                isModified = true;
                String[] row = {"","","","1"};
                tableModel.addRow(row);
            }
        });

        //绑定删除Dao检测按钮点击事件
        removeDaoTableNameBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(curCheckRow!=null){
                    tableModel.removeRow(curCheckRow);
                }
            }
        });

    }

    public void apply() {
        StorageConfig config = MyState.getInstance().getConfig();
        if (null == config) {
            config = new StorageConfig();
        }
        config.setCrmUrlPath(crmUrlPathInput.getText());
        config.setGitUrlPath(gitUrlPathInput.getText());
        config.setMqUrlPath(mqUrlPathInput.getText());
        config.setIpScope(ipScopeInput.getText());
        config.setCachePath(cachePathInput.getText());

        //处理配置中的Dao文件检测的表
        DefaultTableModel tableModel = (DefaultTableModel) daoFileCheckTable.getModel();
        Vector<Vector> dataVector = ((DefaultTableModel) daoFileCheckTable.getModel()).getDataVector();
        Integer rowCount = ((DefaultTableModel) daoFileCheckTable.getModel()).getDataVector().size();
        String[][] daoData = new String[rowCount][tableModel.getColumnCount()];
        for(int i=0;i<rowCount;i++){
            Vector row = dataVector.get(i);
            String[] tableRow = new String[tableModel.getColumnCount()];
            for(int j=1;j<tableModel.getColumnCount();j++){
                if(null==row.get(j) || "".equals(row.get(j))){
                    //存在空值,不允许添加
//                    ValidationInfo validationInfo = new ValidationInfo("存在未配置的行,不允许添加");
//                    Messages.showMessageDialog(validationInfo.message,"提示", Messages.getInformationIcon());
                    continue;
                }
                tableRow[j] = row.get(j).toString();
            }
            daoData[i] = tableRow;
        }
        config.setDaoFileCheckTableNames(daoData);
        MyState.getInstance().setConfig(config);

        /* 重新检索IP */
        InitUtil.connecteMQClient();

        /* 判断是否需要切换MQ的链接地址 */
        if(MyMqttClient.mqttClient==null
                || !MyMqttClient.mqttClient.getCurrentServerURI().equals(mqUrlPathInput.getText())
                || !MyMqttClient.mqttClient.getClientId().split("\\.")[2].equals(ipScopeInput)){
            if(MyMqttClient.mqttClient!=null){
                /* 关闭连接 */
                MyMqttClient.closeConnect();;
            }
            /* 重新 */
            MyMqttClient.init(Datacenter.clientIp);
        }else{
            /* 服务端不变的情况下 刷新下链接 */
            MyMqttClient.reConnect();
        }
        /* 订阅信息 */
        InitUtil.subMessage();
        isModified = false;

    }

}
